package face

// 人脸检测
type ReqFaceDetect struct {
	Image     string `json:"image"`      //图片信息(数据大小应小于 10M)
	ImageType string `json:"image_type"` //图片类型 BASE64:图片的 base64 值; FACE_TOKEN: 人脸标识 URL

	MaxFaceNum      string `json:"max_face_num"`     //最多处理人脸的数目. 默认值为 1，仅检测图片中面积最大的那个人脸 最大值 10
	FaceType        string `json:"face_type"`        //人脸的类型 LIVE 表示生活照:通常为手机、相机拍摄的人像图片、或从网络获取的人像图片等IdCARD 表示身份证芯片照:二代身份证内置芯片中的人像照片 WATERMARK 表示带水印证件照:一般为带水印的小图，如公安网小图CERT 表示证件照片:如拍摄的身份证、工卡、护照、学生证等证件图片 默认 LIVE
	FaceField       string `json:"face_field"`       //包括age,beauty,expression,faceshape,gender,glasses,landmark,race,quality,facetype,feature 信息，逗号分隔. 默认只返回 face_token、人脸框、概率和旋转角度
	LivenessControl string `json:"liveness_control"` //活体控制 检测结果中不符合要求的人脸会被过滤NONE: 不进行控制LOW:较低的活体要求(高通过率 低攻击拒绝率) NORMAL: 一般的活体要求(平衡的攻击拒绝率, 通过率) HIGH: 较高的活体要求(高攻击拒绝率 低通过率) 默认 NONE
}

type FaceList struct {
	FaceToken  string `json:"face_token"`
	UserInfoEx string `json:"user_name,omitempty"` //从数据库中更新
	Location   struct {
		Left     float64 `json:"left"`
		Top      float64 `json:"top"`
		Width    int     `json:"width"`
		Height   int     `json:"height"`
		Rotation int     `json:"rotation"`
	} `json:"location"`
	FaceProbability int `json:"face_probability"`
	Angle           struct {
		Yaw   float64 `json:"yaw"`
		Pitch float64 `json:"pitch"`
		Roll  float64 `json:"roll"`
	} `json:"angle"`
	Landmark []struct {
		X float64 `json:"x"`
		Y float64 `json:"y"`
	} `json:"landmark"`
	Age        float64 `json:"age"`
	Beauty     float64 `json:"beauty"`
	Expression struct {
		Type        string  `json:"type"`
		Probability float64 `json:"probability"`
	} `json:"expression"`
	Gender struct {
		Type        string  `json:"type"`
		Probability float64 `json:"probability"`
	} `json:"gender"`
	Glasses struct {
		Type        string  `json:"type"`
		Probability float64 `json:"probability"`
	} `json:"glasses"`
	EyeStatus struct {
		LeftEye  float64 `json:"left_eye"`
		RightEye float64 `json:"right_eye"`
	} `json:"eye_status"`
	Race struct {
		Type        string  `json:"type"`
		Probability float64 `json:"probability"`
	} `json:"race"`
	FaceShape struct {
		Type        string  `json:"type"`
		Probability float64 `json:"probability"`
	} `json:"face_shape"`
	Quality struct {
		Occlusion struct {
			LeftEye     int     `json:"left_eye"`
			RightEye    float64 `json:"right_eye"`
			Nose        int     `json:"nose"`
			Mouth       int     `json:"mouth"`
			LeftCheek   float64 `json:"left_cheek"`
			RightCheek  float64 `json:"right_cheek"`
			ChinContour float64 `json:"chin_contour"`
		} `json:"occlusion"`
		Blur         float64 `json:"blur"`
		Illumination int     `json:"illumination"`
		Completeness int     `json:"completeness"`
	} `json:"quality"`
	LibLanguage struct {
		Char        string  `json:"char"`
		Probability float64 `json:"probability"`
	} `json:"lib_language"`
}

type RespFaceDetect struct {
	CodeMsg

	Result struct {
		FaceNum  int        `json:"face_num"`
		FaceList []FaceList `json:"face_list"`
	} `json:"result"`
}

// 活体检测。多图活体检测接口，支持 1、3、8 张图片检测
type ReqFaceLiveness struct {
	Image     string `json:"image"`      //图片信息(数据大小应小于 10M)
	ImageType string `json:"image_type"` //图片类型 BASE64:图片的 base64 值; FACE_TOKEN: 人脸标识 URL

	FaceField string `json:"face_field"` //包括age,beauty,expression,faceshape,gender,glasses,landmark,race,quality,facetype,feature 信息，逗号分隔. 默认只返回 face_token、人脸框、概率和旋转角度
	Option    string `json:"option"`     //场景信息，程序会视不同的场景选用相对应的模型。当前支持的场景有 COMMON(通用场景)，GATE(闸机场景)，默认使用 COMMON
}

type RespFaceLiveness struct {
	CodeMsg

	Result struct {
		Thresholds struct {
			Frr1E4 float64 `json:"frr_1e-4"`
			Frr1E3 float64 `json:"frr_1e-3"`
			Frr1E2 float64 `json:"frr_1e-2"`
		} `json:"thresholds"`
		FaceLiveness float64 `json:"face_liveness"`
		FaceList     []struct {
			FaceToken  string `json:"face_token"`
			UserInfoEx string `json:"user_name,omitempty"` //从数据库中更新
			Location   struct {
				Left     float64 `json:"left"`
				Top      float64 `json:"top"`
				Width    int     `json:"width"`
				Height   int     `json:"height"`
				Rotation int     `json:"rotation"`
			} `json:"location"`
			FaceProbability int `json:"face_probability"`
			Angle           struct {
				Yaw   float64 `json:"yaw"`
				Pitch float64 `json:"pitch"`
				Roll  float64 `json:"roll"`
			} `json:"angle"`
			Liveness struct {
				Livemapscore float64 `json:"livemapscore"`
			} `json:"liveness"`
			Age    int     `json:"age"`
			Beauty float64 `json:"beauty"`
		} `json:"face_list"`
	} `json:"result"`
}

// 人脸对比,两张人脸图片相似度对比:比对两张图片中人脸的相似度，并返回相似度分值
type ReqFaceMatch struct {
	Image     string `json:"image"`      //图片信息(数据大小应小于 10M)
	ImageType string `json:"image_type"` //图片类型 BASE64:图片的 base64 值; FACE_TOKEN: 人脸标识 URL

	FaceType        string `json:"face_type"`        //人脸的类型 LIVE 表示生活照:通常为手机、相机拍摄的人像图片、或从网络获取的人像图片等 IdCARD表示身份证芯片照:二代身份证内置芯片中的人像照片 WATERMARK 表示带水印证件照:一般为带水印的小图，如公安网小图 CERT 表示证件照片:如拍摄的	身份证、工卡、护照、学生证等证件图片 	INFRARED 表示红外照片:使用红外相机拍摄的照片(此项功能暂未上线) 默认 LIVE
	QualityControl  string `json:"quality_control"`  //
	LivenessControl string `json:"liveness_control"` //活体控制 检测结果中不符合要求的人脸会被过滤NONE: 不进行控制LOW:较低的活体要求(高通过率 低攻击拒绝率) NORMAL: 一般的活体要求(平衡的攻击拒绝率, 通过率) HIGH: 较高的活体要求(高攻击拒绝率 低通过率) 默认 NONE

}
type RespFaceMatch struct {
	CodeMsg

	Result struct {
		Score    float64 `json:"score"`
		FaceList []struct {
			FaceToken  string `json:"face_token"`
			UserInfoEx string `json:"user_name,omitempty"` //从数据库中更新
		} `json:"face_list"`
	} `json:"result"`
}

// 人脸搜索,在指定人脸集合中，找到最相似的人脸
type ReqFaceIdentify struct {
	Image       string `json:"image"`         //图片信息(数据大小应小于 10M)
	ImageType   string `json:"image_type"`    //图片类型 BASE64:图片的 base64 值; FACE_TOKEN: 人脸标识 URL
	GroupIdList string `json:"group_id_list"` //从指定的 group 中进行查找 用逗号分隔，上限 10个

	UserId         string `json:"user_id"`         //指定 user_id 进行匹配
	QualityControl string `json:"quality_control"` //质量控制 NONE: 不进行控制 LOW:较低的质量要求 NORMAL: 一般的质量要求 HIGH: 较高的质量要求 默认 NONE
	MaxUserNum     uint32 `json:"max_user_num"`    //识别后返回的最大用户数，默认为 1，最多返回 50个

}
type RespFaceIdentify struct {
	CodeMsg

	Result struct {
		FaceToken  string `json:"face_token"`
		UserInfoEx string `json:"user_name,omitempty"` //从数据库中更新
		UserList   []struct {
			GroupId  string  `json:"group_id"`
			UserId   string  `json:"user_id"`
			UserInfo string  `json:"user_info"`
			Score    float64 `json:"score"`
		} `json:"user_list"`
	} `json:"result"`
}

// 多人脸搜索,使用多人脸的图片, 在指定人脸集合中，查找最相似的人脸
type ReqFaceMidentify struct {
	Image       string `json:"image"`         //图片信息(数据大小应小于 10M)
	ImageType   string `json:"image_type"`    //图片类型 BASE64:图片的 base64 值; FACE_TOKEN: 人脸标识 URL
	GroupIdList string `json:"group_id_list"` //从指定的 group 中进行查找 用逗号分隔，上限 10个

	LivenessControl string `json:"liveness_control"`          //活体控制 检测结果中不符合要求的人脸会被过滤NONE: 不进行控制LOW:较低的活体要求(高通过率 低攻击拒绝率) NORMAL: 一般的活体要求(平衡的攻击拒绝率, 通过率) HIGH: 较高的活体要求(高攻击拒绝率 低通过率) 默认 NONE
	MatchThreshold  int    `json:"match_threshold"`           //匹配阈值（设置阈值后，score 低于此阈值的用户信息将不会返回）最大 100 最小 0 默认 80此阈值设置得越高，检索速度将会越快，推荐使用默认阈值 80
	MaxFaceNum      uint32 `json:"max_face_num"`              //最多处理人脸的数目. 默认值为 1，仅检测图片中面积最大的那个人脸 最大值 10
	MaxUserNum      uint32 `json:"max_user_num"`              //	识别后返回的最大用户数，默认为 1，最多返回 50个
	QualityControl  string `json:"quality_control,omitempty"` //质量控制 NONE: 不进行控制 LOW:较低的质	量要求 NORMAL: 一般的质量要求 HIGH:	较高的质量要求 默认 NONE
}
type RespFaceMidentify struct {
	CodeMsg
	Result struct {
		FaceNum  int `json:"face_num"`
		FaceList []struct {
			FaceToken  string `json:"face_token"`
			UserInfoEx string `json:"user_name,omitempty"` //从数据库中更新
			Location   struct {
				Left     float64 `json:"left"`
				Top      float64 `json:"top"`
				Width    int     `json:"width"`
				Height   int     `json:"height"`
				Rotation int     `json:"rotation"`
			} `json:"location"`
			UserList []struct {
				GroupId  string  `json:"group_id"`
				UserId   string  `json:"user_id"`
				UserInfo string  `json:"user_info"`
				Score    float64 `json:"score"`
			} `json:"user_list"`
		} `json:"face_list"`
	} `json:"result"`
}

// // 数据转绘制
// func Data2FaceMidentify(value *RespFaceMidentify) (_frame rpcx_label_center.Frame, _err error) {
// 	var metas = make([]rpcx_label_center.Meta, 0)
// 	if len(value.Result.FaceList) == 0 {
// 		_err = fmt.Errorf("没有搜索到到人脸 %+v", value.Result)
// 		return
// 	}
// 	for _, v := range value.Result.FaceList {
// 		// var pens = []rpcx_label_center.Pen{
// 		// 	{X: int64(v.Location.Left), Y: int64(v.Location.Top)},
// 		// 	{X: int64(v.Location.Left + float64(v.Location.Width)), Y: int64(v.Location.Top)},
// 		// 	{X: int64(v.Location.Left + float64(v.Location.Width)), Y: int64(v.Location.Top) + int64(v.Location.Height)},
// 		// 	{X: int64(v.Location.Left), Y: int64(v.Location.Top) + int64(v.Location.Height)},
// 		// }
// 		var meta = rpcx_label_center.Meta{
// 			X:      int64(v.Location.Left),
// 			Y:      int64(v.Location.Top),
// 			Remark: "多人脸搜索",
// 			TypeId: rpcx_label_center.IdScheme多人脸搜索,
// 			// ProtoWidth:  1920,
// 			// ProtoHeight: 1080,
// 			Rect: &rpcx_label_center.Rect{
// 				Width:  int64(v.Location.Width),
// 				Height: int64(v.Location.Height),
// 				Text:   v.UserInfoEx,
// 				Center: false,
// 			},
// 		}
// 		var userInfo UserInfo
// 		err := json.Unmarshal([]byte(v.UserInfoEx), &userInfo)
// 		if err != nil {
// 			continue
// 		}
// 		meta.Rect.Text = userInfo.UserName
// 		metas = append(metas, meta)
// 	}

// 	_frame = rpcx_label_center.Frame{
// 		Metas: &metas,
// 		AbsoluteTime: &rpcx_label_center.AbsoluteTime{
// 			CenterUnixMs: int64(value.Timestamp * 1000),
// 			DurationMs:   2000,
// 		},
// 	}
// 	return
// }
